<?php

namespace app\admin\controller;

use app\admin\model\Item as ItemModel;
use app\common\controller\Backend;

/**
 * 项目管理
 *
 * @icon fa fa-list
 * @remark 项目管理支持父子两级关系，可以构建项目树形结构
 */
class Item extends Backend
{
    /**
     * @var \app\admin\model\Item
     */
    protected $model = null;
    protected $itemlist = [];
    protected $multiFields = 'grade';

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new ItemModel();
        
        try {
            // 获取项目列表并构建树形结构
            // 使用gradeid作为父级ID，grade作为层级标识（parent/son）
            $itemList = \think\Db::name("item")
                ->alias('i')
                ->join('clinic c', 'i.clinicid = c.id', 'LEFT')
                ->field('i.id,i.itemname,i.itemintro,i.itemprice,i.itemtime,i.grade,i.gradeid,i.clinicid,c.clinicname as clinic_name')
                ->order('i.grade ASC,i.id ASC')
                ->select();
            
            // 处理数据，构建树形结构需要的字段
            foreach ($itemList as $k => &$v) {
                // 使用itemname作为显示标题，如果为空则使用默认名称
                $v['title'] = $v['itemname'] ?: '未命名项目';
                // 使用gradeid作为父级ID，如果gradeid为0或null则为顶级
                $v['pid'] = $v['gradeid'] ?: 0; // 这里保持pid是为了Tree类使用
                // 使用grade作为层级深度
                $v['level'] = $v['grade'];
                // 添加其他必要字段，确保字段存在
                $v['name'] = $v['itemname'] ?: '未命名项目'; // 使用itemname作为name，如果为空则使用默认名称
                $v['type'] = $v['gradeid'] ? 'sub' : 'root';
            }
            unset($v);
            
            // 尝试加载Tree类
            $treeLoaded = false;
            
            // 方案1: 检查类是否存在
            if (class_exists('\fast\Tree')) {
                $treeLoaded = true;
            }
            // 方案2: 手动引入Tree类
            elseif (file_exists(__DIR__ . '/../../extend/fast/Tree.php')) {
                require_once __DIR__ . '/../../extend/fast/Tree.php';
                if (class_exists('\fast\Tree')) {
                    $treeLoaded = true;
                }
            }
            
            if ($treeLoaded) {
                try {
                    // 初始化树形结构
                    $tree = new \fast\Tree();
                    $tree->init($itemList);
                    // 使用简单的空格作为图标，避免产生特殊符号
                    $tree->icon = ['&nbsp;&nbsp;&nbsp;&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;'];
                    $this->itemlist = $tree->getTreeList($tree->getTreeArray(0), 'title');
                    \think\Log::info('Tree类加载成功，使用树形结构');
                } catch (\Exception $e) {
                    \think\Log::error('Tree类初始化失败: ' . $e->getMessage());
                    $treeLoaded = false;
                }
            }
            
            if (!$treeLoaded) {
                // 如果Tree类不存在或初始化失败，使用简单的数组结构，手动构建层级显示
                $this->itemlist = [];
                foreach ($itemList as $item) {
                    if ($item['grade'] == 'parent') {
                        // 父级项目
                        $this->itemlist[] = $item;
                        // 查找子级项目
                        foreach ($itemList as $child) {
                            if ($child['grade'] == 'son' && $child['gradeid'] == $item['id']) {
                                // 移除手动添加的符号，保持原始名称，如果为空则使用默认名称
                                $child['title'] = $child['itemname'] ?: '未命名项目';
                                $this->itemlist[] = $child;
                            }
                        }
                    }
                }
                \think\Log::info('Tree类加载失败，使用简化层级结构');
            }
            
            // 构建父级选择数据（只显示父级项目）
            $itemdata = [0 => __('None')];
            foreach ($itemList as $k => &$v) {
                if ($v['grade'] == 'parent') { // 只显示父级项目作为选择项
                    $itemdata[$v['id']] = $v['title'] ?: '未命名项目';
                }
                if (isset($v['spacer'])) {
                    unset($v['spacer']);
                }
            }
            unset($v);
            
            // 获取诊所数据
            $clinicList = \think\Db::name("clinic")->field('id,clinicname')->order('id ASC')->select();
            $clinicdata = [];
            foreach ($clinicList as $clinic) {
                $clinicdata[$clinic['id']] = $clinic['clinicname'];
            }
            
            $this->view->assign('itemdata', $itemdata);
            $this->view->assign('clinicdata', $clinicdata);
            $this->view->assign("statusList", $this->model->getStatusList());
            $this->view->assign("typeList", $this->model->getTypeList());
            $this->view->assign("gradeList", $this->model->getGradeList());
            
        } catch (\Exception $e) {
            // 如果出现错误，记录日志并设置默认值
            \think\Log::error('Item控制器初始化失败: ' . $e->getMessage());
            $this->itemlist = [];
            $this->view->assign('itemdata', [0 => __('None')]);
            $this->view->assign('clinicdata', []);
            $this->view->assign("statusList", $this->model->getStatusList());
            $this->view->assign("typeList", $this->model->getTypeList());
            $this->view->assign("gradeList", $this->model->getGradeList());
        }
    }

    /**
     * 查看
     */
    public function index()
    {
        if ($this->request->isAjax()) {
            $list = $this->itemlist;
            $total = count($this->itemlist);
            $result = array("total" => $total, "rows" => $list);

            return json($result);
        }
        return $this->view->fetch();
    }

    /**
     * 添加
     */
    public function add()
    {
        if ($this->request->isPost()) {
            $this->token();
            $params = $this->request->post("row/a", [], 'strip_tags');
            if ($params) {
                // 处理父级ID和层级（简化为两级）
                if (isset($params['pid']) && $params['pid'] > 0) {
                    // 如果有父级，设置为子级项目
                    $params['gradeid'] = $params['pid'];
                    $params['grade'] = 'son'; // 固定为子级
                    
                    // 子级项目的诊所必须与父级一致
                    $parentItem = $this->model->where('id', $params['pid'])->find();
                    if ($parentItem) {
                        $params['clinicid'] = $parentItem['clinicid'];
                    }
                } else {
                    // 顶级项目，设置为父级项目
                    $params['gradeid'] = 0;
                    $params['grade'] = 'parent'; // 固定为父级
                }
                
                // 确保数值字段为数字
                if (isset($params['itemprice'])) {
                    $params['itemprice'] = intval($params['itemprice']);
                }
                if (isset($params['clinicid'])) {
                    $params['clinicid'] = intval($params['clinicid']);
                }
                
                // 移除前端传来的pid字段，因为数据库中没有这个字段
                unset($params['pid']);
                
                $result = $this->model->validate()->save($params);
                if ($result === false) {
                    $this->error($this->model->getError());
                }
                $this->success();
            }
            $this->error();
        }
        return $this->view->fetch();
    }

    /**
     * 编辑
     */
    public function edit($ids = null)
    {
        $row = $this->model->get(['id' => $ids]);
        if (!$row) {
            $this->error(__('No Results were found'));
        }
        if ($this->request->isPost()) {
            $this->token();
            $params = $this->request->post("row/a", [], 'strip_tags');
            if ($params) {
                if ($params['pid'] == $row['id']) {
                    $this->error(__('Can not change the parent to self'));
                }
                if ($params['pid'] != $row['gradeid']) { // 使用gradeid进行比较
                    // 简化循环引用检查，避免Tree类依赖
                    if (isset($params['pid']) && $params['pid'] > 0) {
                        $parent = $this->model->where('id', $params['pid'])->find();
                        if ($parent && $parent['gradeid'] == $row['id']) {
                            $this->error(__('Can not change the parent to child'));
                        }
                    }
                }
                
                // 处理父级ID和层级（简化为两级）
                if (isset($params['pid']) && $params['pid'] > 0) {
                    $params['gradeid'] = $params['pid'];
                    $params['grade'] = 'son'; // 固定为子级
                    
                    // 子级项目的诊所必须与父级一致
                    $parentItem = $this->model->where('id', $params['pid'])->find();
                    if ($parentItem) {
                        $params['clinicid'] = $parentItem['clinicid'];
                    }
                } else {
                    $params['gradeid'] = 0;
                    $params['grade'] = 'parent'; // 固定为父级
                }
                
                // 确保数值字段为数字
                if (isset($params['itemprice'])) {
                    $params['itemprice'] = intval($params['itemprice']);
                }
                if (isset($params['clinicid'])) {
                    $params['clinicid'] = intval($params['clinicid']);
                }
                
                // 移除前端传来的pid字段，因为数据库中没有这个字段
                unset($params['pid']);
                
                $result = $row->validate()->save($params);
                if ($result === false) {
                    $this->error($row->getError());
                }
                $this->success();
            }
            $this->error();
        }
        $this->view->assign("row", $row);
        return $this->view->fetch();
    }

    /**
     * 获取父级项目信息
     */
    public function getParentInfo()
    {
        if ($this->request->isPost()) {
            $id = $this->request->post('id');
            if ($id) {
                $parentItem = $this->model->where('id', $id)->find();
                if ($parentItem) {
                    $this->success('', null, [
                        'id' => $parentItem['id'],
                        'itemname' => $parentItem['itemname'],
                        'clinicid' => $parentItem['clinicid']
                    ]);
                } else {
                    $this->error('父级项目不存在');
                }
            } else {
                $this->error('参数错误');
            }
        }
        $this->error('请求方式错误');
    }

    /**
     * 删除
     */
    public function del($ids = "")
    {
        if (!$this->request->isPost()) {
            $this->error(__("Invalid parameters"));
        }
        $ids = $ids ? $ids : $this->request->post("ids");
        if ($ids) {
            // 简化删除逻辑，避免Tree类依赖
            $delIds = [];
            foreach (explode(',', $ids) as $v) {
                $delIds[] = intval($v);
                // 查找子级项目
                $children = $this->model->where('gradeid', $v)->column('id');
                $delIds = array_merge($delIds, $children);
            }
            $delIds = array_unique($delIds);
            $count = $this->model->where('id', 'in', $delIds)->delete();
            if ($count) {
                $this->success();
            }
        }
        $this->error();
    }
}
